Javascript 在这个简单的示例中,Enyo自定义事件未被处理和定义

Javascript 在这个简单的示例中,Enyo自定义事件未被处理和定义,javascript,javascript-events,enyo,Javascript,Javascript Events,Enyo,我正在学习Enyo js框架中的事件,不明白为什么会出现错误,并且没有处理ModelChanged上的事件。错误消息为“未捕获类型错误:未定义不是函数” 代码: 调试器; 恩约({ 名称:“MyModel”, 种类:“enyo.Model”, defaultSource:“模拟”, 出版:{ 标题:“未设置”, 文本:“未设置”, }, 活动:{ 在模型更改时:“”, }, 处理程序:{ onModelChanged:“modelLoadedHandler” }, modelLoadedHand

我正在学习Enyo js框架中的事件,不明白为什么会出现错误,并且没有处理ModelChanged上的事件。错误消息为“未捕获类型错误:未定义不是函数”

代码:

调试器;
恩约({
名称:“MyModel”,
种类:“enyo.Model”,
defaultSource:“模拟”,
出版:{
标题:“未设置”,
文本:“未设置”,
},
活动:{
在模型更改时:“”,
},
处理程序:{
onModelChanged:“modelLoadedHandler”
},
modelLoadedHandler:函数(inSender、inEvent){
调试器;
log(“模型中的处理程序”);
console.log(inEvent.textMsg);
返回true;
},
获取:函数(opts){
这是继承的(论点);
调试器;
this.doModelChanged({textMsg:“fire event”});//未捕获类型错误:未定义不是函数
}       
});
var模型=新的MyModel();
model.fetch();
请注意,将此代码保留为JSFIDLE不会删除的答案

enyo.kind({
    name: "MyMockSource",
    kind: "enyo.Source",
    fetch: function(model, opts) {
        if(model instanceof enyo.Model) {
            opts.success({title: "testing", text: "Some stuff"});
        } else {
            throw new Error("Model mock only");
        }
    }
});

new MyMockSource({name: "mocked"});

enyo.kind({
    name : "MyModel",
    kind: "enyo.Model",
    source: "mocked",
    attributes: {
        title : "not set",
        text : "not set",       
    },
    fetched: function(opts){
        this.inherited(arguments);
        enyo.log("fetched");
        // Do something here if you need to, otherwise you might want to overload
        // the parse method and set parse: true to modify the retrieved data
    },
    titleChanged: function(was, is) {
        enyo.log("Title is now: " + is);
    }
});

enyo.kind({
    name: "MyView",
    components: [
        {kind: "Button", content: "Fetch", ontap: "fetch"},
        {name: "title"},
        {name: "text"}
    ],
    bindings: [
        {from: "model.title", to: "$.title.content"},
        {from: "model.text", to: "$.text.content"}
    ],
    fetch: function() {
        this.set("model", new MyModel());    // Probably want to create model elsewhere
        this.model.on("change", enyo.bindSafely(this, "modelChanged"));
        this.model.fetch();
    },
    modelChanged: function() {
        this.log("Something happened to my model!");
    }
});

new enyo.Application({ name: "app", view: "MyView" });

当您以这种方式使用事件系统时,您通常希望链上更高的组件处理onModelChanged事件,而不是定义事件的组件。此外,enyo.Model是一个特例,我相信它使用了不同的观察者机制。这可能就是函数调用得到“未定义”的原因,因为onModelChanged与DomainModelChanged方法之间没有神奇的映射。

enyo.Model
不是
enyo.Object
(更不用说
enyo.Component
)。它不支持已发布的属性或事件。您需要为模型定义属性。您仍然可以使用
propertyChanged
事件或使用
observer
获取有关属性更改的通知

此外,如果您想知道提取已完成,可能需要重载已提取的
<代码>获取可能在获取数据之前返回

如果要从外部订阅事件,则可能需要使用
model.on('change')
绑定到模型上的特定属性或
changed
事件(注意,这是一个不同于其他地方使用的
events:[]
系统的事件系统)

更新:这里有一把小提琴,展示了使用模型和绑定数据的各种方法


对不起,我是JS和UI新手,没有理解您所说的外部事件。但是如何修复此代码以使其按我所期望的方式工作?我的意思是,如果您希望从非模型本身的对象中捕获模型中的事件。添加了工作小提琴。