【问题标题】:Emberjs cannot delegate setEmberjs 不能委托集合
【发布时间】:2014-03-07 15:25:45
【问题描述】:

当我最后构建我的应用程序时,我想测试我的所有功能,但主要功能停止工作......

我的登录表单似乎无法从表单中获取用户信息。

我的登录模板:

<script type="text/x-handlebars" data-template-name="login">
    <form {{action "login" on=submit}}>
        <div>
        <div>
            <label>Domain</label>
        </div>
        <div>
            {{input type="text" value=domain placeholder="Domain"}}

        </div>
    </div>

    <div>
        <div>
            <label>Username</label>
        </div>
        <div>
            {{input value=username type="text" placeholder="Username"}}
        </div>
    </div>

    <div>
        <div>
            <label>Password</label>
        </div>
        <div>
            {{input value=password type="password" placeholder="Password"}}
        </div>
    </div>
    <button type="submit" {{bind-attr disabled="isProcessing"}}>Log in</button>
    </form>
</script>

还有我的登录控制器:

App.LoginController = Ember.ObjectController.extend({
    actions: {
        login: function() {
            var data = this.getProperties("domain", "username", "password");

            console.log(data);
        }
    }
});

我的“登录”操作已触发,但出现了无法解释的错误:

Assertion failed: Cannot delegate set('domain', g) to the 'content' property of object proxy <App.LoginController:ember330>: its 'content' is undefined.

Uncaught Error: Property set failed: object in path "domain" could not be found or was destroyed.

一开始它是有效的,我必须说我不知道​​这是什么问题。

[编辑] 这是我的 LoginController 和我的地图:

App.Router.map(function() {
    this.route('login', { path: '/' });
    this.route('home');
});

App.LoginController = Ember.ObjectController.extend({
    loginFailed: false,
    isProcessing: false,
    isSlowConnection: false,
    timeout: null,

    actions: {
        isSession: function(transition) {
            var session = this;
            Ember.$
                .get(host + '/session', function(data) {
                    console.log('DEBUG: Session OK');
                    var log = data.user;
                    session.store.push('login', log);
                })
                .fail(function() {
                    console.log('DEBUG: Session FAIL');
                    transition.abort();
                    session.transitionToRoute('login');
                });
        },
        login: function() {
            this.setProperties({
                loginFailed: false,
                isProcessing: true
            });
            this.set("timeout", setTimeout(this.slowConnection.bind(this), 1));
            var data = this.getProperties("domain", "username", "password");

            console.log(data);
            this.getLoginInfo(data);
        }
    },
    slowConnection: function() {
        this.set('isSlowConnection', true);
    },
    reset: function() {
        clearTimeout(this.get("timeout"));
        this.setProperties({
            loginFailed: false,
            isSlowConnection: false,
            isProcessing: false
        });
    },
    getLoginInfo: function(data) {
        var login = this;
        Ember.$
        .post(host + '/login', data, function(data) {
            console.log('DEBUG: Login OK');
            login.reset();
            var test = data.session.user;
            login.store.push('login', test);
            login.transitionToRoute('home');
        })
        .fail(function() {
            login.reset();
            login.set('loginFailed', true);
            console.log('DEBUG: Login Failed')
        });
    }
});

我在每个 beforeModel 中为我的其他页面使用 isSession 函数来验证会话是否仍然可用,如果是,则将登录数据推回商店以再次保存。

【问题讨论】:

  • 请包括测试。
  • 发生此错误的原因通常是ObjectControllercontent 属性为null。您的代码中是否还有其他地方 set 该控制器的内容?
  • 我不确定你的问题,但我只是在我的 LoginController 中使用这些数据。也是我应用的第一页...

标签: ember.js


【解决方案1】:

您是登录控制器的扩展 Em.ObjectController。 ObjectController 内容的默认值为null。您应该定义内容属性以将值设置为内容。下面的代码将起作用

App.LoginController = Ember.ObjectController.extend({
content: {},
actions: {
    login: function() {
        var data = this.getProperties("domain", "username", "password");

        console.log(data);
    }
}
});

【讨论】:

  • 我遇到了类似的错误,但这个解决方案对我不起作用。而是将ObjectController 替换为Controller,如stackoverflow.com/a/16329411/877492中所述工作
  • 请注意,content 现在已弃用。立即使用model
  • 添加到@neciu: guides.emberjs.com/v1.10.0/controllers/… --> 如果您在路由中覆盖 setupController 方法,调用 controller.set('model', model) 非常重要。我被它咬了。
【解决方案2】:

您的属性应在控制器上声明(如果它们被推迟到其模型):

App.LoginController = Ember.ObjectController.extend({
    domain: null,
    username: null,
    password: null,
    actions: {
        login: function() {
            var data = this.getProperties("domain", "username", "password");

            console.log(data);
        }
    }
});

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多